Production optimization problems often involve large, highly complex reservoir models, thousands of unknowns and many nonlinear constraints, which makes the numerical calculation of gradients for the optimization process impractical. Adjoint models can be used for the calculation of gradients very efficiently. However, direct coding of the adjoint model is typically complex and time consuming, and the code is dependent on the forward model in the sense that it must be updated whenever the forward model is modified.
A recently developed adjoint construction procedure makes it relatively easy to construct the adjoint equation and has the additional advantage of making the adjoint simulation code independent of the forward simulation code. For a fully implicit forward model and specific forms of the cost function and nonlinear constraints, all information necessary for the adjoint run is calculated and stored during the forward simulation itself. The adjoint run then requires only the appropriate assembling of this information to calculate gradients of the cost function with respect to control variables at each control step. During the assembling procedure, the adjoint equation at each timestep is solved for Lagrange multipliers using information obtained from forward simulation such as Jacobians.
As used herein, the adjoint equation is a linear equation formed with the transpose of the Jacobian matrix that is evaluated at convergence for each timestep, such as from a fully implicit reservoir simulator. Conventional preconditioners (e.g., Constrained Pressure Residual (CPR) preconditioner, nested factorization method) typically cannot be directly applied to the adjoint equation, especially when dealing with large and/or complex reservoir models. In particular, conventional preconditioners exploit properties of the Jacobian matrix in order to accelerate convergence during reservoir simulation and therefore, often prove impractical and ineffective for solving the adjoint equation.